/**
 * Description:
 * Class Name:InferenceTest
 * Date:2022/3/25 19:11
 *
 * @author LTisme
 * @version JAVA17
 */
package 疯狂Java讲义.第9章_泛型._9_4_泛型方法._9_4_5_类型推断;

class MyUtil<E>{
    public static <Z> MyUtil<Z> nil(){
        return null;
    }
    public static <Z> MyUtil<Z> cons(Z head, MyUtil<Z> tail){
        return null;
    }
    E head(){
        return null;
    }
}

public class InferenceTest {
    public static void main(String[] args) {
        // 可以通过方法赋值的目标参数来推断泛型为String
        MyUtil<String> ls = MyUtil.nil();

        // 无须使用下面语句在调用nil()方法时指定泛型的类型
        MyUtil<String> mu = MyUtil.<String>nil();

        // 可调用cons()方法所需的参数类型来推断泛型为Integer
        MyUtil.cons(42, MyUtil.nil());

        // 无须使用下面语句在调用nil()方法时指定泛型的类型
        MyUtil.cons(42, MyUtil.<Integer>nil());

        // 希望系统能推断处调用nil()方法时泛型为String类型
        // 但实际上Java8依然推断不出来，下面代码是错误的
//        String s = MyUtil.nil().head();

        // 若要正确运行，需将其改为
//        String s = MyUtil.<String>nil().head();
    }
}
